<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <title>Spring事务  &middot; sitename</title>
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">


<meta name="description" content="Spring事务 description" />

<meta name="keywords" content="one, two, ">


<meta property="og:title" content="Spring事务  &middot; sitename ">
<meta property="og:site_name" content="sitename"/>
<meta property="og:url" content="https://lvzongcheng.gitee.io/spring/spring%E4%BA%8B%E5%8A%A1/" />
<meta property="og:locale" content="en-EN">


<meta property="og:type" content="article" />
<meta property="og:description" content="Spring事务 description"/>
<meta property="og:article:published_time" content="2017-05-13T00:00:00Z" />
<meta property="og:article:modified_time" content="2017-05-13T00:00:00Z" />

  
    
<meta property="og:article:tag" content="one">
    
<meta property="og:article:tag" content="two">
    
  

  

<script type="application/ld+json">
  {
    "@context": "http://schema.org",
    "@type": "Article",
    "headline": "Spring事务",
    "author": {
      "@type": "Person",
      "name": "LvZongCheng"
    },
    "datePublished": "2017-05-13",
    "description": "Spring事务 description",
    "wordCount":  154 
  }
</script>



<link rel="canonical" href="https://lvzongcheng.gitee.io/spring/spring%E4%BA%8B%E5%8A%A1/" />

<link rel="apple-touch-icon-precomposed" sizes="144x144" href="https://lvzongcheng.gitee.io/touch-icon-144-precomposed.png">
<link href="https://lvzongcheng.gitee.io/favicon.png" rel="icon">

<meta name="generator" content="Hugo 0.60.0" />

  <!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->

<link href='https://fonts.googleapis.com/css?family=Merriweather:300%7CRaleway%7COpen+Sans' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="/css/font-awesome.min.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/highlight/default.css">

  
  
	<script>
	  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
	  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
	  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
	  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

	  ga('create', 'Your Google Analytics tracking code', 'auto');
	  ga('send', 'pageview');

	</script>

</head>
<body>
  <main id="main-wrapper" class="container main_wrapper has-sidebar">
    <header id="main-header" class="container main_header">
  <div class="container brand">
  <div class="container title h1-like">
  <a class="baselink" href="https://lvzongcheng.gitee.io">
  LvZongCheng

</a>

</div>

  
<div class="container topline">
  
  淡定 执著 进取 自律


</div>


</div>

  <nav class="container nav primary no-print">
  

<a class="homelink" href="https://lvzongcheng.gitee.io">home</a>


  
<a href="https://lvzongcheng.gitee.io/framework" title="Show list of Frameworks">Frameworks</a>

<a href="https://lvzongcheng.gitee.io/java" title="Show list of Java">Java</a>

<a href="https://lvzongcheng.gitee.io/linux" title="Show list of Linux">Linux</a>

<a href="https://lvzongcheng.gitee.io/redis" title="Show list of Redis">Redis</a>

<a href="https://lvzongcheng.gitee.io/sql" title="Show list of SQL">SQL</a>

<a href="https://lvzongcheng.gitee.io/Spring" title="Show list of Spring">Spring</a>

<a href="https://lvzongcheng.gitee.io/tools" title="Show list of Tools">Tools</a>

<a href="https://lvzongcheng.gitee.io/webpage" title="Show list of WebPage">WebPage</a>

<a href="https://lvzongcheng.gitee.io/information" title="Show list of information">information</a>

<a href="https://lvzongcheng.gitee.io/network" title="Show list of network">network</a>

<a href="https://lvzongcheng.gitee.io/%E5%BE%AE%E6%9C%8D%E5%8A%A1" title="Show list of 微服务">微服务</a>

<a href="https://lvzongcheng.gitee.io/%E6%80%BB%E7%BB%93" title="Show list of 总结">总结</a>

<a href="https://lvzongcheng.gitee.io/%E6%9C%BA%E5%99%A8%E8%87%AA%E5%8A%A8%E5%8C%96" title="Show list of 机器自动化">机器自动化</a>

<a href="https://lvzongcheng.gitee.io/%E6%B1%87%E7%BC%96" title="Show list of 汇编">汇编</a>

<a href="https://lvzongcheng.gitee.io/%E8%AE%B0%E4%BA%8B%E6%9C%AC" title="Show list of 记事本">记事本</a>


</nav>

<div class="container nav secondary no-print">
  
<a id="contact-link-email" class="contact_link" rel="me" aria-label="Email" href="mailto:Lyc19880405@163.com">
  <span class="fa fa-envelope-square"></span></a>



<a id="contact-link-github" class="contact_link" rel="me" aria-label="Github" href="https://github.com/enten/hugo-boilerplate">
  <span class="fa fa-github-square"></span></a>




 


















</div>


  

</header>


<article id="main-content" class="container main_content single">
  <header class="container hat">
  <h1>Spring事务
</h1>

</header>

  <div class="container content">
  <h3 id="12spring">1.2Spring的事务管理:</h3>
<h5 id="spring2">spring中支持一下2中事务声明方式</h5>
<ul>
<li>
<ol>
<li>编程式事务  当系统需要明确的，细粒度的控制各个事务的边界，应选择编程式事务</li>
</ol>
</li>
<li>2.声明式事务  当系统对于事务的控制粒度较粗时，应该选择申明式事务</li>
</ul>
<h5 id="121-spring">1.2.1 Spring的事务管理</h5>
<p>JavaEE的开发需要分成三层:</p>
<ul>
<li>事务的开发,事务一般都加在Service层.</li>
</ul>
<h5 id="122-springapi">1.2.2 Spring提供管理事务的API</h5>
<p>PlatformTransactionManager	:平台事务管理器.<br>
|&ndash;获得事务,操作事务.<br>
TransactionDefinition		:事务定义信息:<br>
|&ndash;事务定义信息(隔离、传播、超时、只读)</p>
<h6 id="transactionstatus---">TransactionStatus			:事务状态:</h6>
<p>关系:<br>
PlatformTransactionManager 根据 TransactionDefinition对事务定义的信息管理事务,在管理事务的过程中产生一些状态:由TransactionStatus记录
用来管理事务的真正接口:</p>
<blockquote>
<p>org.springframework.jdbc.datasource.DataSourceTransactionManager	使用Spring JDBC或iBatis 进行持久化数据时使用<br>
org.springframework.orm.hibernate3.HibernateTransactionManager		使用Hibernate3.0版本进行持久化数据时使用<br>
org.springframework.orm.jpa.JpaTransactionManager	使用JPA进行持久化时使用<br>
org.springframework.jdo.JdoTransactionManager	当持久化机制是Jdo时使用<br>
org.springframework.transaction.jta.JtaTransactionManager	使用一个JTA实现来管理事务，在一个事务跨越多个资源时必须使用</p>
</blockquote>
<h6 id="transactiondefinition">TransactionDefinition:</h6>
<p>事务特性:ACID<br>
原子性 一致性 隔离性 持久性. 
隔离性引发安全性问题:<br>
三个读问题:<br>
|&ndash;  脏读:一个事务读到另一个事务未提交数据<br>
|&ndash; 不可重复读:一个事务读到另一个事务 已经提交 update 数据.<br>
|&ndash; 虚读:一个事务读到另一个事务 已经提交 insert 数据.</p>
<h6 id="solationxxx--">SOLATION_XXX		:事务隔离级别.</h6>
<ul>
<li>DEFAULT		:默认的. Mysql:REPEATABLE_READ  Orale:READ_COMMITED</li>
<li>READ_UNCOMMITED	:三种读问题都有可能发生</li>
<li>READ_COMMITED		:避免脏读但是不可重复读和虚读有可能发生</li>
<li>REPEATABLE_READ	:避免脏读,不可重复读但是虚读有可能发生</li>
<li>SERIALIZABLE		:避免事务并发问题.</li>
</ul>
<h6 id="propagionxxx--">PROPAGION_XXX		:事务的传播行为</h6>
<ul>
<li><code>PROPAGATION_REQUIRED</code>		支持当前事务，如果不存在 就新建一个(默认)</li>
</ul>
<ul>
<li>A,B 如果A中有事务,B使用A的事务.如果A没有事务 B就创建一个事务.(A,B是在一个事务中.)</li>
</ul>
<ul>
<li>PROPAGATION_SUPPORTS		支持当前事务，如果不存在，就不使用事务</li>
</ul>
<ul>
<li>A,B 如果A中有事务,B使用A的事务,如果A没有事务 B就不用事务.</li>
</ul>
<ul>
<li>PROPAGATION_MANDATORY	支持当前事务，如果不存在，抛出异常</li>
</ul>
<ul>
<li>A,B 如果A中有事务,B使用A的事务,如果A没有事务 抛出移除</li>
</ul>
<ul>
<li><code>PROPAGATION_REQUIRES_NEW</code>	如果有事务存在，挂起当前事务，创建一个新的事务</li>
</ul>
<ul>
<li>A,B 如果A中有事务,B将A的事务挂起,创建一个新的事务.(A,B没有在一个事务中.)</li>
</ul>
<ul>
<li>PROPAGATION_NOT_SUPPORTED	以非事务方式运行，如果有事务存在，挂起当前事务</li>
</ul>
<ul>
<li>A,B如果A中有事务,B就将A挂起.B不用事务.</li>
</ul>
<ul>
<li>PROPAGATION_NEVER 	以非事务方式运行，如果有事务存在，抛出异常</li>
</ul>
<ul>
<li>A,B如果A有事务 抛出异常</li>
</ul>
<ul>
<li><code>PROPAGATION_NESTED</code>	如果当前事务存在，则嵌套事务执行</li>
</ul>
<ul>
<li>A,B 如果A有事务.执行A的事务.之后将这个设置一个保存点SavePoint.执行B的操作,如果B发生异常.自动回到保存点的位置.用户根据具体需求设置回滚还是提交.</li>
</ul>
<h6 id="heading">区别:</h6>
<ul>
<li>PROPAGATION_REQUIRED		:A,B总在一个事务中.要么一起成功要么一起失败.</li>
<li>PROPAGATION_REQUIRES_NEW:A,B不在一个事务中.</li>
<li>PROPAGATION_NESTED		:嵌套事务,基于SavePoint.</li>
</ul>
<h5 id="123-spring">1.2.3 Spring中事务的操作:</h5>
<ol>
<li>
<p>编程式的事务管理:<br>
* 编写代码的时候完成的事务的管理.</p>
</li>
<li>
<p>声明式的事务管理:<br>
* 通过配置完成对事务管理的操作.</p>
</li>
</ol>
<p>事务
@Transactional(readOnly=true) 只读</p>
<h4 id="heading1">搭建事务转账环境:</h4>
<h6 id="-">步骤一: 建表.</h6>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="spring">步骤二:搭建Spring开发环境:</h6>
<p>导入6个基本包<br>
配置文件 :<br>
|&ndash; 日志 applicationContext.xml
数据库驱动:<br>
Spring的jdbc操作的包:<br>
C3P0的jar包:<br>
|&ndash; 一个属性文件 :jdbc.properties</p>
<h6 id="daoservice">步骤三:编写dao和service</h6>
<ul>
<li>cn.itcast.spring3.demo1</li>
<li>AccountService</li>
<li>AccountServiceImpl</li>
<li>AccountDao</li>
<li>AccountDaoImpl</li>
</ul>
<h6 id="daoservicespring">步骤四:把DAO和Service交给Spring管理:</h6>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="daojdbc">步骤五:Dao完成JDBC的操作:</h6>
<ul>
<li>将JdbcTemplate注入给DAO:</li>
</ul>
<ol>
<li>在Dao上继承JdbcDaoSupport类.</li>
<li>将连接池的信息注入给DAO就可以了.</li>
</ol>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="daoservice1">步骤六:将Dao注入给Service:</h6>
<ol>
<li>在Service类中提供Dao对象,对其提供set方法.</li>
<li>在SPring的配置文件中进行注入</li>
</ol>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="dao">步骤七:将Dao中的方法实现;</h6>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="service">步骤八:在Service层完成转账操作:</h6>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h6 id="heading2">步骤九:编写测试:</h6>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->

</div>


  
</article>
      <footer id="main-footer" class="container main_footer">
  

  <div class="container nav foot no-print">
  
<a href="https://lvzongcheng.gitee.io/license">license</a>


  <a class="toplink" href="#">back to top</a>

</div>

  <div class="container credits">
  
<div class="container footline">
  
  code with <!-- raw HTML omitted --><!-- raw HTML omitted -->


</div>


  
<div class="container copyright">
  
  (c) 2015 yourname.


</div>


</div>

</footer>

    </main>
    
<script type="text/javascript">
  (function() {
    
    
    if (window.location.hostname == "localhost")
      return;
    var dsq = document.createElement('script'); dsq.async = true; dsq.type = 'text/javascript';
    dsq.src = '//your_disqus_shortname.disqus.com/count.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
  })();
</script>



<script src="/js/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>



    
  </body>
</html>

